/*
 * @(#)KnowledgeBase.java        1.0 2000/05/09
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//BASE DE CONOCIMIENTO			//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//

package xfuzzy.lang;

/**
 * Clase abstracta que describe una base de conocimiento
 * 
 * @author Francisco Jos� Moreno Velo
 * @modified Pablo Mart�n Mu�oz
 *
 */
public abstract class KnowledgeBase implements Cloneable {
	//----------------------------------------------------------------------------//
	//                           CONSTANTES P�BLICAS                              //
	//----------------------------------------------------------------------------//

	/**
	 * C�digo para representar una base de conocimientos en forma de conjunto de reglas
	 */
	public static final int RULE_SET = 0;
	
	/**
	 * C�digo para representar una base de conocimientos en forma de lista ordenada de reglas
	 */	
	public static final int RULE_LIST = 1;
	
	//----------------------------------------------------------------------------//
	//                            MIEMBROS P�BLICOS                               //
	//----------------------------------------------------------------------------//

	/**
	 * Conjunto de operadores utilizados en la base de conocimiento
	 */
	public Operatorset operation;

	//----------------------------------------------------------------------------//
	//                                CONSTRUCTOR                                 //
	//----------------------------------------------------------------------------//

	/**
	 * Constructor
	 */
	public KnowledgeBase() {
	
	}

 	//----------------------------------------------------------------------------//
	//                             M�TODOS P�BLICOS                               //
	//----------------------------------------------------------------------------//

	/**
	 * Obtiene el identificador de la base de conocimiento
	 */
	public abstract String toString();

	/**
	 * Compara un nombre con el identificador de la base de conocimiento
	 */
	public abstract boolean equals(String name);

	/**
	 * Obtiene un duplicado del objeto
	 */
	public abstract Object clone();

	/**
	 * Elimina los enlaces para poder eliminar la base de conocimiento
	 */
	public abstract void dispose();

	//----------------------------------------------------------------------------//
	// M�todos de acceso a los campos                                             //
	//----------------------------------------------------------------------------//

	/**
	 * Obtiene el nombre de la base de conocimiento
	 */
	public abstract String getName();

	/**
	 * Obtiene el conjunto de operadores utilizado en la base
	 */
	public abstract Operatorset getOperatorset();

	/**
	 * Obtiene la lista de variables de entrada
	 */
	public abstract Variable[] getInputs();

	/**
	 * Obtiene la lista de variables de salida	
	 */
	public abstract Variable[] getOutputs();

	/**
	 *  Obtiene la base de conocimient
	 */
	//public abstract Rule[] getRules();
	
	/**
	 *  Obtiene el numero de reglas de la base de conocimiento
	 */
	public abstract int getNumOfRules();
	
	/**
	 * Verifica si la base de conocimiento esta siendo utilizada
	 */
	public abstract boolean isLinked();

	/**
	 * Verifica si la base de conocimiento esta siendo editada
	 */
	public abstract boolean isEditing();

	//----------------------------------------------------------------------------//
	// M�todos de asignaci�n de los campos                                        //
	//----------------------------------------------------------------------------//

	/**
	 * Asigna el conjunto de operadores utilizado
	 */
	public abstract void setOperatorset(Operatorset op);

	/**
	 * Incrementa el contador de enlaces (usos) del objeto
	 */
	public abstract void link();

	/**
	 * Decrementa el contador de enlaces (usos) del objeto
	 */
	public abstract void unlink();

	/**
	 * Asigna el contenido del campo de edicion
	 */
	public abstract void setEditing(boolean editing);

	/**
	 * Asigna el nombre de la base de conocimiento
	 */
	public abstract void setName(String name);

	//----------------------------------------------------------------------------//
	// M�todos para a�adir valores                                                //
	//----------------------------------------------------------------------------//

	/**
	 * A�ade una variable de entrada
	 */
	public abstract void addInputVariable(Variable var);

	/**
	 * A�ade una variable de salida
	 */
	public abstract void addOutputVariable(Variable var);

	/**
	 *  A�ade una regla	
	 */
	//public abstract void addRule(Rule rule);

	//----------------------------------------------------------------------------//
	// M�todos para eliminar valores                                              //
	//----------------------------------------------------------------------------//

	/**
	 * Elimina una regla
	 */
	//public abstract void remove(Rule rl);

	/**
	 * Elimina todas las reglas	
	 */
	public abstract void removeAllRules();

	/**
	 * Elimina una variable de entrada	
	 */
	public abstract void removeInputVar(Variable var);

	/**
	 * Elimina una variable de salida
	 */
	public abstract void removeOutputVar(Variable var);

	//----------------------------------------------------------------------------//
	// M�todos de b�squeda e intercambio                                          //
	//----------------------------------------------------------------------------//
	
	/**
	 * Busca una variable
	 */
	public abstract Variable searchVariable(String varname);

	/**
	 * Calcula el numero de veces que la i-esima variable de salida aparece en el
	 * consecuente de las reglas
	 */
	public abstract int computeOutputSize(int i);

	/**
	 * Intercambia dos funciones de pertenencia
	 */
	public abstract void exchange(LinguisticLabel oldmf, LinguisticLabel newmf);

	/**
	 * Intercambia dos variables
	 */
	public abstract void exchange(Variable oldvar, Variable newvar);

	//----------------------------------------------------------------------------//
	// M�todos que genaran c�digo                                                 //
	//----------------------------------------------------------------------------//

	/**
	 * Genera la descripci�n XFL3 de la base de conocimiento
	 */
	public abstract String toXfl();

	//----------------------------------------------------------------------------//
	// M�todos de c�lculo del proceso de inferencia                               //
	//----------------------------------------------------------------------------//

	/**
	 * Realiza la inferencia con los valores de las variables de entrada y 
	 * almacena los valores de las variables de salida,	el grado de activacion 
	 * de cada regla y la funcion de pertenencia agregada de cada salida		
	 */
	public abstract void compute(Variable[] ivar, Variable[] ovar, double[] degree,
			MemFunc[] value);

	/**
	 * Calcula la derivada del proceso de inferencia
	 */
	public abstract void derivative(double[] derror) throws XflException;

	/**
	 * Calcula la derivada del proceso de inferencia
	 */
	public abstract void derivative() throws XflException;

	/**
	 * Actualiza el campo de ajustabilidad de las reglas
	 */
	public abstract void setAdjustable();

	/**
	 * Inicializa el grado de activaci�n m�xima de las reglas
	 */
	public abstract void resetMaxActivation();
}
